package java学习.第07章_面向对象编程_进阶;

/**
 * ClassName: B_面向对象特征之继承性
 * Package: java学习.第07章_面向对象编程_进阶
 * Description:
 *
 * @Author 张蛟龙
 * @Create 2023/3/6 17:37
 * @Version 1.0
 */
public class B_面向对象特征之继承性 {
    /**
     * 继承 ：子类继承了父类的所有（属性和方法） 不继承构造器
     *          如果 父类 的东西是私有的，就不能直接访问（保证了封装性）
     *          虽然不能直接调用，但是存在
     *
     * 继承的好处
     * 继承的出现减少了代码冗余，提高了代码的复用性。
     * 继承的出现，更有利于功能的扩展。
     * 继承的出现让类与类之间产生了is-a的关系，
     *      为多态的使用提供了前提。
     * 继承描述事物之间的所属关系，这种关系是：
     *      is-a 的关系。可见，父类更通用、更一般，子类更具体。
     *
     * 继承的基本概念：
     * 类B，称为子类、派生类(derived class)、SubClass
     * 类A，称为父类、超类、基类(base class)、SuperClass
     *
     * 继承 所有类都 直接或间接 继承于 Object
     *
     * Java可以单继承（类是继承 可以多层继承），
     *      后续可以使用实现接口的方式，解决单继承的局限性
     *
     *        多实现(接口是实现)
     * 子类获取了父类声明的全部属性和方法，可能收到封装性的影响，不能直接调用
     */
    public static void main(String[] args) {
        System.out.println("----猫----");
        Cat cat = new Cat();
        cat.name = "汤姆";//可以调用父类的属性
        cat.eat("老鼠");//可以调用父类的方法
        cat.ability();
        System.out.println("----狗----");
        Dog dog = new Dog();
        dog.name = "大黄";//可以调用父类的属性
        dog.eat("剩饭");//可以调用父类的方法
        dog.ability();

        System.out.println("---父类----");
        System.out.println("本类:" + cat.getClass());
        System.out.println("父类:" + cat.getClass().getSuperclass());
        System.out.println("父类的父类:" + cat.getClass().getSuperclass().getSuperclass());
    }
}
//称为子类、派生类(derived class)、SubClass
class Cat extends Animal {
    public void ability(){
        System.out.println("猫抓老鼠");
    }
}
//称为子类、派生类(derived class)、SubClass
class Dog extends Animal {
    public void ability(){
        System.out.println("狗看家护卫");
    }
}
//称为父类、超类、基类(base class)、SuperClass
class Animal {
    String name;
    int age;
    private String s;

    public void eat(String food){
        System.out.println(this.name + "吃" + food);
    }

}
